package cn.mandifal.manager.service.impl;

import cn.mandifal.manager.service.GoodsSpecificationService;
import cn.mandifal.mapper.DpSpecificationMapper;
import cn.mandifal.mapper.DpSpecificationOptMapper;
import cn.mandifal.pojo.*;
import com.alibaba.dubbo.config.annotation.Service;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import entity.PageResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;

import java.util.Date;
import java.util.List;
import java.util.Map;
/**
 * 商品规格服务层
 * @author shun
 */
@Service
@Transactional
public class GoodsSpecificationServiceImpl implements GoodsSpecificationService {
    @Autowired
    private DpSpecificationMapper dpSpecificationMapper;
    @Autowired
    private DpSpecificationOptMapper dpSpecificationOptMapper;

    /**
     * 查询所有规格
     * @param pageNum 页码
     * @param pageSize 页面大小
     * @return
     */
    @Override
    public PageResult findAll(int pageNum, int pageSize) {
        //开始分页，一个 startpage 语句只管最近的一个 sql 语句
        PageHelper.startPage(pageNum,pageSize);
        DpSpecificationExample example=new DpSpecificationExample();
        Page<DpSpecification> page= (Page<DpSpecification>) dpSpecificationMapper.selectByExample(example);
        return new PageResult(page.getTotal(),page.getResult());
    }

    /**
     * 模糊查询所有规格
     * @param pageNum 页码
     * @param pageSize 页面大小
     * @param dpSpecification 商品规格实体
     * @return
     */
    @Override
    public PageResult findAll(int pageNum, int pageSize, DpSpecification dpSpecification) {
        //开始分页
        PageHelper.startPage(pageNum,pageSize);
        DpSpecificationExample dpSpecificationExample=new DpSpecificationExample();
        DpSpecificationExample.Criteria criteria = dpSpecificationExample.createCriteria();
        //如果没有条件则查询所有
        if (dpSpecification.getSpecName() !=null && dpSpecification.getSpecName().length()>0){
            criteria.andSpecNameLike("%"+dpSpecification.getSpecName()+"%");
        }
        Page<DpSpecification>page= (Page<DpSpecification>) dpSpecificationMapper.selectByExample(dpSpecificationExample);
        return new PageResult(page.getTotal(),page.getResult());
    }

    /**
     * 添加商品规格和规格选项
     * @param specificationCombine 规格组合实体
     */
    @Override
    public void add(SpecificationCombine specificationCombine) {
        //为规格设置创建时间
        specificationCombine.getDpSpecification().setCreateTime(new Date());
        //插入商品规格，并把 id 返回到dpSpecification中
        dpSpecificationMapper.insert(specificationCombine.getDpSpecification());
        //循环列表，把每一项都插入Dp_specification_Opt 中
        for ( DpSpecificationOpt dpSpecificationOpt:
                specificationCombine.getDpSpecificationOptList()) {
            //为规格选项设置创建时间
            dpSpecificationOpt.setCreateTime(new Date());
            //为规格选项设置规格 id
            dpSpecificationOpt.setSpecId(specificationCombine.getDpSpecification().getId());
            dpSpecificationOptMapper.insert(dpSpecificationOpt);
        }
    }

    /**
     * 查询规格及选项
     * @param id 规格 id
     * @return 返回组合实体
     */
    @Override
    public SpecificationCombine findOne(Long id) {
        SpecificationCombine specificationCombine=new SpecificationCombine();
        //存入DpSpecification
        specificationCombine.setDpSpecification(dpSpecificationMapper.selectByPrimaryKey(id));
        //设置条件
        DpSpecificationOptExample example=new DpSpecificationOptExample();
        DpSpecificationOptExample.Criteria criteria = example.createCriteria();
        criteria.andSpecIdEqualTo(id);
        //根据条件查询规格选项，并存入specificationCombine
        specificationCombine.setDpSpecificationOptList(dpSpecificationOptMapper.selectByExample(example));
        return specificationCombine;
    }

    /**
     * 更新
     * @param specificationCombine 规格组合实体
     */
    @Override
    public void update(SpecificationCombine specificationCombine) {
        //为规格设置更新时间
        specificationCombine.getDpSpecification().setUpdateTime(new Date());
        //更新规格
        dpSpecificationMapper.updateByPrimaryKey(specificationCombine.getDpSpecification());
        //更新规格选项
        for (DpSpecificationOpt dpSpecificationOpt:
                specificationCombine.getDpSpecificationOptList()) {
            //如果规格选项的 id 存在则更新，
            if (dpSpecificationOpt.getId() != null){
                //通过 id 查到规格选项
                DpSpecificationOpt dpSpecificationOpt1 = dpSpecificationOptMapper.selectByPrimaryKey(dpSpecificationOpt.getId());
                String optionName = dpSpecificationOpt1.getOptionName();
                Integer orders = dpSpecificationOpt1.getOrders();
                //判断选项名字和顺序是否和原来的相等，有一个不等就更新
                if(! dpSpecificationOpt.getOptionName().equals(optionName) || ! dpSpecificationOpt.getOrders().equals(orders) ){
                    dpSpecificationOpt.setUpdateTime(new Date());
                    dpSpecificationOptMapper.updateByPrimaryKey(dpSpecificationOpt);
                }

            }
            //如果规格选项的 id 不存在且规格选项的名字长度》0 则插入
            if (dpSpecificationOpt.getId() == null && dpSpecificationOpt.getOptionName().length()>0){
                dpSpecificationOpt.setCreateTime(new Date());
                dpSpecificationOpt.setSpecId(specificationCombine.getDpSpecification().getId());
                dpSpecificationOptMapper.insert(dpSpecificationOpt);
            }
        }

    }

    /**
     * 删除规格
     * @param ids 规格 id 的数组
     */
    @Override
    public void delete(Long[] ids) {
        for (Long id: ids) {
            //删除规格选项
            DpSpecificationOptExample example=new DpSpecificationOptExample();
            DpSpecificationOptExample.Criteria criteria = example.createCriteria();
            criteria.andSpecIdEqualTo(id);
            dpSpecificationOptMapper.deleteByExample(example);
            //删除规格
            dpSpecificationMapper.deleteByPrimaryKey(id);

        }
    }

    /**
     * 删除规格选项
     * @param id 规格选项 id
     */
    @Override
    public void deleteOpt(Long id) {
        dpSpecificationOptMapper.deleteByPrimaryKey(id);
    }
    /**
     * 选择规格 id 和 name name 以 text 返回
     * @return 返回集合类型的 list 列表
     */
    @Override
    public List<Map> selectSpecList() {
        return dpSpecificationMapper.selectSpecList();
    }
}
